package com.burns.java.io;

/**
 * 【案例 】读取文件内容
 * 字节流
 * 读文件内容
 * */
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class hello {

	public static String filePath = "testFile" + File.separator + "hello.txt";

	public static void main(String[] args) throws Exception {
//		test1();
//		test2();
//		test3();
//		test4();
		test5();

	}

	public static void test1() throws Exception {

		// String fileName="D:"+File.separator+"hello.txt";
		File f = new File(filePath);
		InputStream in = new FileInputStream(f);
		byte[] b = new byte[1024];// 只能读取2014个字节，对于的读不出来，少的话，就用空格填充
		in.read(b);
		in.close();
		String fileContext = new String(b);
		System.out.println(fileContext.length());
		System.out.println(fileContext);

	}

	/**
	 * 注意：该test1()中由于b字节数组长度为1024，如果文件较小，则会有大量填充空格。我们可以利用in.read(b);的返回值来设计程序，
	 * 如下案例：
	 * 
	 * @throws Exception
	 */
	public static void test2() throws Exception {

		// String fileName="D:"+File.separator+"hello.txt";
		File f = new File(filePath);
		InputStream in = new FileInputStream(f);
		byte[] b = new byte[1024];
		int len = in.read(b);
		in.close();
		System.out.println("读入长度为：" + len);
		String fileContext = new String(b, 0, len);
		System.out.println(fileContext.length());
		System.out.println(fileContext);

	}

	/**
	 * 注意：观察上面的例子可以看出，我们预先申请了一个指定大小的空间，但是有时候这个空间可能太小，有时候可能太大，我们需要准确的大小，这样节省空间，
	 * 那么我们可以这样做：
	 * 
	 * 字节流 读文件内容,节省空间
	 * 
	 * @throws Exception
	 */
	public static void test3() throws Exception {

		// String fileName="D:"+File.separator+"hello.txt";
		File f = new File(filePath);
		InputStream in = new FileInputStream(f);
		System.out.println("文件大小size:" + f.length());
		byte[] b = new byte[(int) f.length()];
		in.read(b);
		System.out.println("文件长度为：" + f.length());
		in.close();
		String fileContext = new String(b);
		System.out.println(fileContext.length());
		System.out.println(fileContext);

	}

	/**
	 * 注意：观察上面的例子可以看出，我们预先申请了一个指定大小的空间，但是有时候这个空间可能太小，有时候可能太大，我们需要准确的大小，这样节省空间，
	 * 那么我们可以这样做：
	 * 
	 * 逐字节读
	 * 
	 * @throws Exception
	 */
	public static void test4() throws Exception {

		// String fileName="D:"+File.separator+"hello.txt";
		File f = new File(filePath);
		InputStream in = new FileInputStream(f);
		byte[] b = new byte[(int) f.length()];
		for (int i = 0; i < b.length; i++) {
			b[i] = (byte) in.read();
		}
		in.close();
		System.out.println(new String(b));

	}
	/**
	 * 注意：上面的几个例子都是在知道文件的内容多大，然后才展开的，有时候我们不知道文件有多大，这种情况下，我们需要判断是否独到文件的末尾。
	 * 字节流读文件
	 * 
	 * 这个例子只能读取1024个字节以内得，多余得就报内存溢出了。
	 * 
	 * @throws Exception
	 */
	public static void test5() throws Exception {
		
		// String fileName="D:"+File.separator+"hello.txt";
		File f = new File(filePath);
		 InputStream in=new FileInputStream(f);
	       byte[] b=new byte[1024];
	       int count =0;
	       int temp=0;
	       //注意：当读到文件末尾的时候会返回-1.正常情况下是不会返回-1的。
	       while((temp=in.read())!=(-1)){
	           b[count++]=(byte)temp;
	       }
	       in.close();
	       System.out.println(new String(b));
		
	}

}
